//
// Created by suzhen on 16-12-9.
//

#ifndef ORIONV2_ASYNCEVENTGENERATOR_H
#define ORIONV2_ASYNCEVENTGENERATOR_H

#include "Orion.h"
#include "FutureAdapt.hpp"

ORION_V2_NAMESPACE_BEGIN

        /**
         * 服务器 表示一个基本执行单元
         * 当服务器被用户close之后,server指针立即失效,无法提供isClose等方法供外部调用,故Server不提供该类方法
         */
        class AsyncEventGenerator {

            friend class AbstractAsyncStream;

        public:
            virtual ~AsyncEventGenerator();

            explicit AsyncEventGenerator(size_t readBufSz = DEFAULT_READ_BUFFER_SIZE);

            //异步接收新传入的连接,成功时,将会在Socket.OnOpen中进行回调
            void submit(AbstractAsyncStream *s);

            /**
             * 直接调用start , event_generator 将会在当前线程中运行eventloop
             */
            void start();

            /**
             * 直接调用start , event_generator 将会在创建一个新的
             * 线程中，并且运行eventloop
             * @return future 是否启动成功
             */
            Future<bool> startAsync();

            /**
             * 同步关闭
             */
            void stop();


            /**
             * 异步关闭,返回 stopFuture
             * @return stopFuture
             */
            Future<bool> stopAsync();

            /**
             * stopFuture eventGenerator 关闭后，此future将会返回
             * @return
             */
            Future<bool> stopFuture();

            RawDataType *getReadBuffer();

            size_t getReadBufferSize();

        public:
            ThreadId getEventGeneratorThreadId();

            CoreLoopContext *getEventGeneratorCoreLoop();

        private:

            //on Accept
            static void AsyncStreamAcceptCallBack(uv_async_t *);

            //异步停止回调
            static void GeneratorAsyncStopCb(uv_async_t *async);

            //卸载所有的底层处理器
            static void UninstallHandlesCb(uv_handle_t *hd);

        private:
            CoreLoopContext *generatorCoreLoop_;
            ThreadId threadId_;
            RawDataType *readBuffer_;
            size_t readBufferSize_;
            //
            int openInHandle_;
            AsyncContext closeAsyncCtx_;
            AsyncContext acceptAsyncCtx_;//异步accept上下文
            //内部字段
            Promise<bool> closePromise_;
            bool isClosing_;
            std::recursive_mutex internalLock_;
            //
            std::list<ORION_V2::AbstractAsyncStream *> acceptQueue_;
        };


ORION_V2_NAMESPACE_END


#endif //ORIONV2_ASYNCEVENTGENERATOR_H
